package com.tedu.day02.oop;

/**
 * 抽象类：抽象类与抽象方法 关键字：abstract
 * 类：只能提供行为概念，没有具体实现行为
 *
 *
 * 与面向对象--多态有绝对的关系
 * 使用多态创建抽象类的对象，抽象类本身无法创建对象，需要使用多态完成抽象类创建
 *
 * 什么情况下使用抽象类？
 * 复杂项目时，需要在不同的类下实现不同的功能，首选抽象类【Android常用】
 *
 * 定义抽象类与抽象方法？
 * 抽象类：修饰符 abstract class 类名{} ---毫无意义，必须结合抽象方法
 * 抽象方法：修饰符 abstract 返回值 方法(参数);--没有具体的实现
 *
 * 抽象类"实例化：创建对象"抽象类自身无法实例化
 * ①创建【n个】子类，继承抽象【父】类，子类一定实现抽象【父】类的所有抽象方法
 * ②使用面向对象：多态【向上造型】 抽象类 引用=new 【实现】子类();   ---这种方法使用最多
 *注意：抽象类一定会发生重写，子类继承抽象【父】类，也可以叫作"实现类"！
 */
abstract class Animals{//抽象类
    //抽象方法:没有具体的实现【代码块】---特征：一旦抽象类出现，一定会被继承，一定是多态性的
    public abstract void say();
    //①定义一个由final修饰的抽象方法           ×
    //public final abstract void sleep();
    //②定义一个抽象的变量  abstract无法定义变量 ×
    //abstract int i=1;
    //③定义静态变量                          √
    static int i=1;
    //④定义一个静态的抽象变量                  ×
    //static abstract int j=1;
    //⑤定义一个静态的抽象方法【无实现】          ×
    //public static abstract void eat();
    //⑥定义一个静态方法【无实现:加空代码块】      √
    public static void eat(){};
    //⑤⑥总结：抽象方法/静态方法（二选一），定义方法：修饰符static/abstract 返回值 方法名
    //⑦可以定义内部类，可以定义静态内部类         √
    static class Sos{}
    //⑧抽象类有构造器      （就是构造函数）      √

    public Animals() {
    }
    //⑨抽象类普通实现方法   可以                √
    public void run(){}
    //⑩抽象类可以继承抽象类吗 实现：两个抽象类--形容一个实现
    abstract class Thing extends Animals{public abstract void sleep();
    }
}

//目的：两个抽象类中所有抽象方法--继承【子】抽象类
//实现类：实现抽象[父]类的方法---多个实现类---继承---抽象
class Person1 extends  Animals{//报错原因：需要完成重写
    @Override
    public void say() {
        System.out.println("人---说话");
    }
}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法创建对象：提供抽象方法--必须由子类实现--多态【造型】
        Animals a=new Person1();
        a.say();//向上造型--重写抽象【父】类的抽象方法【覆盖】
    }
}
